// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/task_runner_test_template.h"

namespace base {

namespace test {

    TaskTracker::TaskTracker()
        : task_runs_(0)
        , task_runs_cv_(&lock_)
    {
    }

    TaskTracker::~TaskTracker() { }

    Closure TaskTracker::WrapTask(const Closure& task, int i)
    {
        return Bind(&TaskTracker::RunTask, this, task, i);
    }

    void TaskTracker::RunTask(const Closure& task, int i)
    {
        AutoLock lock(lock_);
        if (!task.is_null()) {
            task.Run();
        }
        ++task_run_counts_[i];
        ++task_runs_;
        task_runs_cv_.Signal();
    }

    std::map<int, int> TaskTracker::GetTaskRunCounts() const
    {
        AutoLock lock(lock_);
        return task_run_counts_;
    }

    void TaskTracker::WaitForCompletedTasks(int count)
    {
        AutoLock lock(lock_);
        while (task_runs_ < count)
            task_runs_cv_.Wait();
    }

    void ExpectRunsTasksOnCurrentThread(bool expected_value,
        TaskRunner* task_runner)
    {
        EXPECT_EQ(expected_value, task_runner->RunsTasksOnCurrentThread());
    }

} // namespace test

} // namespace base
